package com.im.service.utils;

import com.alibaba.fastjson.JSONObject;

import com.im.codec.pack.group.AddGroupMemberPack;
import com.im.codec.pack.group.RemoveGroupMemberPack;
import com.im.codec.pack.group.UpdateGroupMemberPack;
import com.im.common.ClientType;
import com.im.common.enums.command.Command;
import com.im.common.enums.command.GroupEventCommand;
import com.im.common.model.ClientInfo;
import com.im.service.group.model.req.GroupMemberDto;
import com.im.service.group.service.ImGroupMemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 此类负责使用 MessageProducer 和 ImGroupMemberService 生成群组消息。
 */
@Component
public class GroupMessageProducer {

    @Autowired
    private MessageProducer messageProducer;
    @Autowired
    private ImGroupMemberService imGroupMemberService;

    /**
     * 此方法根据提供的 userId、command、data 和 clientInfo 生成群组消息。
     * 它从数据中检索 groupId 和 ImGroupMemberService 中的 groupMemberId。
     * 根据命令，将消息发送到适当的成员。
     *
     * @param userId     发送者的用户 ID。
     * @param command    要执行的命令。
     * @param data       要发送的数据。
     * @param clientInfo 客户端信息。
     */
    public void producer(String userId, Command command, Object data, ClientInfo clientInfo) {
        JSONObject o = (JSONObject) JSONObject.toJSON(data);
        String groupId = o.getString("groupId");
        List<String> groupMemberId = imGroupMemberService.getGroupMemberId(groupId, clientInfo.getAppId());

        if (command.equals(GroupEventCommand.ADDED_MEMBER)) {
            // 将消息发送到群组管理员和添加的成员。
            List<GroupMemberDto> groupManager = imGroupMemberService.getGroupManager(groupId, clientInfo.getAppId());
            AddGroupMemberPack addGroupMemberPack = o.toJavaObject(AddGroupMemberPack.class);
            List<String> members = addGroupMemberPack.getMembers();
            for (GroupMemberDto groupMemberDto : groupManager) {
                if (clientInfo.getClientType() != ClientType.WEBAPI.getCode() && groupMemberDto.getMemberId().equals(userId)) {
                    // 如果客户端类型不是 WEBAPI，则将消息发送到所有群组管理员，除了发送者。
                    messageProducer.sendToUserExceptClient(groupMemberDto.getMemberId(), command, data, clientInfo);
                } else {
                    messageProducer.sendToUser(groupMemberDto.getMemberId(), command, data, clientInfo.getAppId());
                }
            }
            for (String member : members) {
                if (clientInfo.getClientType() != ClientType.WEBAPI.getCode() && member.equals(userId)) {
                    // 如果客户端类型不是 WEBAPI，则将消息发送到所有添加的成员，除了发送者。
                    messageProducer.sendToUserExceptClient(member, command, data, clientInfo);
                } else {
                    messageProducer.sendToUser(member, command, data, clientInfo.getAppId());
                }
            }
        } else if (command.equals(GroupEventCommand.DELETED_MEMBER)) {
            // 将消息发送到所有群组成员，包括被删除的成员。
            RemoveGroupMemberPack pack = o.toJavaObject(RemoveGroupMemberPack.class);
            String member = pack.getMember();
            List<String> members = imGroupMemberService.getGroupMemberId(groupId, clientInfo.getAppId());
            members.add(member);
            for (String memberId : members) {
                if (clientInfo.getClientType() != ClientType.WEBAPI.getCode() && member.equals(userId)) {
                    // 如果客户端类型不是 WEBAPI，则将消息发送到所有群组成员，除了发送者。
                    messageProducer.sendToUserExceptClient(memberId, command, data, clientInfo);
                } else {
                    messageProducer.sendToUser(memberId, command, data, clientInfo.getAppId());
                }
            }
        } else if (command.equals(GroupEventCommand.UPDATED_MEMBER)) {
            // 将消息发送到所有群组管理员和更新的成员。
            UpdateGroupMemberPack pack = o.toJavaObject(UpdateGroupMemberPack.class);
            String memberId = pack.getMemberId();
            List<GroupMemberDto> groupManager = imGroupMemberService.getGroupManager(groupId, clientInfo.getAppId());
            GroupMemberDto groupMemberDto = new GroupMemberDto();
            groupMemberDto.setMemberId(memberId);
            groupManager.add(groupMemberDto);
            for (GroupMemberDto member : groupManager) {
                if (clientInfo.getClientType() != ClientType.WEBAPI.getCode() && member.equals(userId)) {
                    // 如果客户端类型不是 WEBAPI，则将消息发送到所有群组管理员，除了发送者。
                    messageProducer.sendToUserExceptClient(member.getMemberId(), command, data, clientInfo);
                } else {
                    messageProducer.sendToUser(member.getMemberId(), command, data, clientInfo.getAppId());
                }
            }
        } else {
            // 将消息发送到所有群组成员。
            for (String memberId : groupMemberId) {
                if (clientInfo.getClientType() != null && clientInfo.getClientType() != ClientType.WEBAPI.getCode() && memberId.equals(userId)) {
                    // 如果客户端类型不是 WEBAPI，则将消息发送到所有群组成员，除了发送者。
                    messageProducer.sendToUserExceptClient(memberId, command, data, clientInfo);
                } else {
                    messageProducer.sendToUser(memberId, command, data, clientInfo.getAppId());
                }
            }
        }
    }

}
